【MediaPipe ✕ Cubemos SDK】骨格検出した身体と手を対応付ける(3DCG編)
カフェチームの山本です。
今までは、MediaPipeのMulti Hand Trackingで検出したLandmarkのデータのみをもとに、商品を取ったことの検出、手のポーズの認識、を行ってきました。
今回は、カフェチームの他のメンバーが取り組んでいる、Cubemos SDKによる身体の骨格検出のデータと組み合わせることを考えます。
結論としては、身体の骨格がある程度正確に検出されていれば、手と身体を紐付けられることがわかりました。
目的
現在、カフェチームでは、MediaPipeを用いた手の骨格検出と、Cubemos SDKを用いた身体の骨格に取り組んでいます。今回は、これら2つの情報を組み合わせるため、それぞれ検出した骨格同士を紐付けたいと思います。具体的には、まず、Cubemos SDKで身体の骨格を検出します。その情報をもとに、手の骨格を検出して、それらの手がどの身体のものであるか(誰の手であるか)を判定します。
実験
利用データ
画像データ
今回利用したのは、3DCGの画像です。これは、同じくカフェチームの宮島がUnreal Engineで作成したものです。詳しい内容はこちらの記事をご覧ください。
身体の骨格データ
CubemosのSDKにかけると、以下のように身体の骨格が検出されます。
出力されるデータは、人ごとに、身体の18点ごとの、画像におけるx,y座標と検出の確信度(confidence)が得られます。上の画像では、確信度が高い点は緑、確信度が中の点は黄色、確信度が低い点は赤、で描画しています。SDKについては、同じくカフェチームの清野が執筆したCubemos SDKに関する記事をご覧ください。
方法
今回はCubemos SDKによる身体の骨格検出データを前提として、以下のように身体と手を紐付ける方法を試します。
- (上記で検出された身体ごとに、以下を繰り返す)
- 骨格検出データのうち、手首(左手首・右手首)の座標を取り出す(上図の5・8番の点)
- 元の入力画像のうち、手首の座標の周辺を切り出す
- 切り出した画像をMulti Hand Tracking(MediaPipe)にかける
- 検出された手のうち、手の骨格中の手首の位置が、身体の骨格の手首の位置と最も近いものを、その身体の手として紐付ける
結果
身体の骨格の手首を中心に切り出した画像と、Multi Hand Trackingで手の骨格を検出した画像を並べて表示します。また、それぞれの手首の位置の距離も示します(単位は、画像の一辺の長さを1としています)。手が複数検出された場合は、距離も複数示しています。確信度は、Cubemos SDKの出力した、その手首の位置の確信度をそのまま示します。
正しく紐付けできているかを目視で確認しました。
正しく紐付けできたもの
- 結果1(確信度:0.820、距離:0.0988)
- 結果2(確信度:1.001、距離:0.0587)
- 結果3(確信度:0.966、距離:0.0726・0.446)
- 結果4(確信度:0.971、距離:0.0531)
- 結果5(確信度:0.713、距離:0.152)
- 結果6(確信度:0.443、距離:0.0816・0.384)
- 結果7(確信度:0.220、距離:0.114・0.569)
- 結果8(確信度:0.334、距離:0.0799・0.113)
- (Cubemos SDKで左の白青の服の人の左手首と判定されている位置)
正しく紐付けできなかったもの
- 結果9(確信度:0.915、距離:0.030・0.126)
- 右の黄色い服の人の右手首と判定されている位置だが、左の人の手を紐付けられている
- 結果10(確信度:0)
- そもそも、手首の位置を検出できていない
分析
おおよそ正しく紐付けできています。各結果を細かくみると、以下のようなことがわかります。
- 結果1~結果4のような、確信度が高い場合は、手首同士の距離が近く、正しく紐付けしやすい
- 結果5~結果7のような、確信度が低い場合でも、紐付けができる。逆に手の位置から、身体の手首の位置を補正することもできる
- 結果8では正しく紐付けられているが、そもそも手首の位置がずれているので、偶然成功したといえる。結果9では、確信度が高くても、正しく紐付けができていない。そのため、結果8、結果9のように、身体の骨格検出の時点で、腕がクロスしていたり、手首が近くにある場合は、紐付けには工夫や補正が必要
- 結果10に関しては、そもそも身体の骨格検出の精度を上げることが必要。もしくは、手を全部検出し、手に対して身体を紐付ける方法(今回とは逆)も検討してみるのも良さそうです。
結果8、9の問題に対する工夫の例として、(MediaPipeはv0.7.5では、検出した手が右手・左手かの判定を出力するため)右手首には右手のみを、左手首には左手のみを紐付けの対象にすることが考えられます。
(上の方法によって、今回利用した画像では正しく判定できますが、左手が2つ写った場合など、対応できない状況もまだあります。)
まとめ
今回は、Cubemos SDKによる身体の骨格検出の結果をもとに、MediaPipeによる手の骨格検出の結果と紐付けする方法を試しました。3DCGで確認したところ、おおよそ正しく紐付けできることがわかりました。
今後は、今回紐付けできなかったケースに対応する方法を考えます。